import axios from 'axios';

// 创建axios实例
const service = axios.create({
  // 根据环境设置基础URL
  baseURL: import.meta.env.VITE_API_BASE_URL,
  // 请求超时时间
  timeout: 15000,
  // 请求头设置
  headers: {
    // 'Content-Type': 'multipart/form-data',
  }
});

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 在发送请求前做些什么
    // 例如：获取并设置token
    const token = localStorage.getItem('token');
    if (token) {
      config.headers['token'] = token;
    }
    
    return config;
  },
  error => {
    // 对请求错误做些什么
    console.error('请求错误:', error);
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  response => {
    // 对响应数据做些什么
    const res = response.data;
    
    // 根据实际情况调整
    // 假设后端返回格式为 { code: 0, data: {}, message: '' }
    if (res.code !== 0) {
      // 处理业务错误
      console.error(`业务错误: ${res.message || '未知错误'}`);
      
      // 特定状态码处理
    //   if (res.code === 401) {
    //     // 未授权，跳转登录页或刷新token
    //     redirectToLogin();
    //   }
      
      // 返回错误信息
      return Promise.reject(new Error(res.message || '未知错误'));
    } else {
      // 直接返回数据部分
      return res.data;
    }
  },
  error => {
    // 对响应错误做些什么
    if (error.response) {
      // 请求已发出，但服务器响应状态码不在 2xx 范围内
      const status = error.response.status;
      const errorMessage = getErrorMessageByStatus(status, error.response.data);
      
      // 处理特定状态码
      switch (status) {
        case 401:
          // 未授权，跳转登录
          redirectToLogin();
          break;
        case 403:
          // 权限不足
          console.error('权限不足');
          break;
        case 404:
          // 资源不存在
          console.error('请求的资源不存在');
          break;
        case 500:
          // 服务器错误
          console.error('服务器错误');
          break;
        default:
          // 其他错误
          console.error(`请求失败: ${errorMessage}`);
      }
      
      return Promise.reject(new Error(errorMessage));
    } else if (error.request) {
      // 请求已发出，但没有收到响应
      console.error('没有收到服务器响应');
      return Promise.reject(new Error('网络错误，请检查您的网络连接'));
    } else {
      // 设置请求时发生错误
      console.error('请求配置错误:', error.message);
      return Promise.reject(error);
    }
  }
);

// 重定向到登录页
function redirectToLogin() {
  // 可以使用router或直接跳转
  // 保存当前路径，登录后返回
  const currentPath = window.location.pathname;
  localStorage.setItem('redirectPath', currentPath);
  
  // 跳转到登录页
  window.location.href = '/login';
  
  // 如果使用Vue Router:
  // import router from '@/router';
  // router.push('/login');
}

// 根据状态码获取错误信息
function getErrorMessageByStatus(status, data) {
  const statusMessages = {
    400: '请求参数错误',
    401: '未授权，请重新登录',
    403: '拒绝访问',
    404: '请求的资源不存在',
    408: '请求超时',
    500: '服务器内部错误',
    501: '服务未实现',
    502: '网关错误',
    503: '服务不可用',
    504: '网关超时',
    505: 'HTTP版本不受支持'
  };
  
  // 优先使用服务器返回的消息
  if (data && data.message) {
    return data.message;
  }
  
  // 使用预定义的状态消息
  return statusMessages[status] || `未知错误 (${status})`;
}

// 封装通用请求方法
/**
 * GET请求
 * @param {string} url - 请求地址
 * @param {Object} params - 请求参数
 * @param {Object} config - 其他配置
 * @returns {Promise}
 */
export function get(url, params = {}, config = {}) {
  return service.get(url, { params, ...config });
}

/**
 * POST请求
 * @param {string} url - 请求地址
 * @param {Object} data - 请求数据
 * @param {Object} config - 其他配置
 * @returns {Promise}
 */
export function post(url, data = {}, config = {}) {
  return service.post(url, data, config);
}

/**
 * PUT请求
 * @param {string} url - 请求地址
 * @param {Object} data - 请求数据
 * @param {Object} config - 其他配置
 * @returns {Promise}
 */
export function put(url, data = {}, config = {}) {
  return service.put(url, data, config);
}

/**
 * DELETE请求
 * @param {string} url - 请求地址
 * @param {Object} params - 请求参数
 * @param {Object} config - 其他配置
 * @returns {Promise}
 */
export function del(url, params = {}, config = {}) {
  return service.delete(url, { params, ...config });
}

/**
 * 上传文件
 * @param {string} url - 上传地址
 * @param {FormData} formData - 表单数据
 * @param {Function} onProgress - 进度回调函数
 * @param {Object} config - 其他配置
 * @returns {Promise}
 */
export function upload(url, formData, onProgress = null, config = {}) {
  const uploadConfig = {
    headers: {
      'Content-Type': 'multipart/form-data'
    },
    ...config
  };
  
  if (onProgress) {
    uploadConfig.onUploadProgress = progressEvent => {
      const percentCompleted = Math.round(
        (progressEvent.loaded * 100) / progressEvent.total
      );
      onProgress(percentCompleted);
    };
  }
  
  return service.post(url, formData, uploadConfig);
}

/**
 * 下载文件
 * @param {string} url - 下载地址
 * @param {Object} params - 请求参数
 * @param {string} filename - 文件名
 * @param {Function} onProgress - 进度回调函数
 * @param {Object} config - 其他配置
 * @returns {Promise}
 */
export function download(url, params = {}, filename = '', onProgress = null, config = {}) {
  const downloadConfig = {
    responseType: 'blob',
    params,
    ...config
  };
  
  if (onProgress) {
    downloadConfig.onDownloadProgress = progressEvent => {
      const percentCompleted = Math.round(
        (progressEvent.loaded * 100) / progressEvent.total
      );
      onProgress(percentCompleted);
    };
  }
  
  return service
    .get(url, downloadConfig)
    .then(response => {
      // 创建blob链接
      const blob = new Blob([response]);
      const downloadUrl = URL.createObjectURL(blob);
      
      // 创建下载链接
      const link = document.createElement('a');
      link.href = downloadUrl;
      link.download = filename || getFilenameFromResponse(response);
      document.body.appendChild(link);
      link.click();
      
      // 清理
      document.body.removeChild(link);
      URL.revokeObjectURL(downloadUrl);
      
      return response;
    });
}

// 从响应头获取文件名
function getFilenameFromResponse(response) {
  const contentDisposition = response.headers['content-disposition'];
  if (contentDisposition) {
    const filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
    const matches = filenameRegex.exec(contentDisposition);
    if (matches != null && matches[1]) {
      return matches[1].replace(/['"]/g, '');
    }
  }
  
  // 默认文件名
  return `download-${new Date().getTime()}`;
}

// 导出请求实例和封装的方法
export default {
  service,
  get,
  post,
  put,
  delete: del,
  upload,
  download
};
